/**
 * Copyright 2020 Webank.
 *
 * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of the License at
 *
 * <p>http://www.apache.org/licenses/LICENSE-2.0
 *
 * <p>Unless required by applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.webank.blockchain.gov.acct.contract;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.fisco.bcos.sdk.abi.FunctionReturnDecoder;
import org.fisco.bcos.sdk.abi.TypeReference;
import org.fisco.bcos.sdk.abi.datatypes.Address;
import org.fisco.bcos.sdk.abi.datatypes.Bool;
import org.fisco.bcos.sdk.abi.datatypes.Event;
import org.fisco.bcos.sdk.abi.datatypes.Function;
import org.fisco.bcos.sdk.abi.datatypes.Type;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple1;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple2;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.contract.Contract;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.eventsub.EventCallback;
import org.fisco.bcos.sdk.model.CryptoType;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.model.callback.TransactionCallback;
import org.fisco.bcos.sdk.transaction.model.exception.ContractException;

@SuppressWarnings("unchecked")
public class AccountManager extends Contract {
    public static final String[] BINARY_ARRAY = {
        "6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506163fa806100536000396000f300608060405260043610620000eb576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630315242914620000f057806313af403514620001815780634031d6ae14620001c757806345c8b1a61462000225578063460a42b9146200028357806346438ca014620003015780638d1fdf2f14620003875780639d33dc0d14620003e5578063a28c6fed1462000463578063ad0f024414620004fc578063b2bdfa7b146200052e578063b8c1828e1462000588578063c8e40fbf14620005e6578063fb47e0161462000644578063ff86983814620006ca575b600080fd5b348015620000fd57600080fd5b5062000134600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000728565b60405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b3480156200018e57600080fd5b50620001c5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000a77565b005b348015620001d457600080fd5b506200020b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000bff565b604051808215151515815260200191505060405180910390f35b3480156200023257600080fd5b5062000269600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000c14565b604051808215151515815260200191505060405180910390f35b3480156200029057600080fd5b50620002e7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000e8e565b604051808215151515815260200191505060405180910390f35b3480156200030e57600080fd5b5062000345600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001079565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200039457600080fd5b50620003cb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620010e2565b604051808215151515815260200191505060405180910390f35b348015620003f257600080fd5b5062000449600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200135c565b604051808215151515815260200191505060405180910390f35b3480156200047057600080fd5b50620004e2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff1690602001909291905050506200145d565b604051808215151515815260200191505060405180910390f35b3480156200050957600080fd5b50620005146200169d565b604051808215151515815260200191505060405180910390f35b3480156200053b57600080fd5b5062000546620016af565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200059557600080fd5b50620005cc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620016d4565b604051808215151515815260200191505060405180910390f35b348015620005f357600080fd5b506200062a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620017d3565b604051808215151515815260200191505060405180910390f35b3480156200065157600080fd5b5062000688600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001855565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620006d757600080fd5b506200070e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620018be565b604051808215151515815260200191505060405180910390f35b600080600080846000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151562000843576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f616c726561647920657869737465642e0000000000000000000000000000000081525060400191505060405180910390fd5b30866200084f62002215565b808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050604051809103906000f080158015620008d5573d6000803e3d6000fd5b50925082915081600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f9e9b7ad5aadf19ffbb1e871018274dedcd0a276d311a7cbf5138e1d5e516feb730604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a360018294509450505050915091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000b62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc66d1d23a5b7baf1f496bb19f580d7b12070ad5a08a758c990db97d961fa33a660405160405180910390a350565b600062000c0d8233620019fe565b9050919050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000d04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190508373ffffffffffffffffffffffffffffffffffffffff167fc0d78d00cd87c129d30acb1af322bfdda683a26281ce525d9dbbf5223709873230604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff16636a28f0006040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562000e4857600080fd5b505af115801562000e5d573d6000803e3d6000fd5b505050506040513d602081101562000e7457600080fd5b810190808051906020019092919050505092505050919050565b600080600083600286600062000ea7848484846200145d565b151562000f42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f4163636f756e744d616e616765723a2075736572206e6f74207573657250657281526020017f6d69747465642e0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b62000f4e8989620019fe565b965086156200106d57600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffff",
        "ffffffffffffffffffff1695508594508473ffffffffffffffffffffffffffffffffffffffff1663a02b161e60026040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156200102d57600080fd5b505af115801562001042573d6000803e3d6000fd5b505050506040513d60208110156200105957600080fd5b810190808051906020019092919050505096505b50505050505092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515620011d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190508373ffffffffffffffffffffffffffffffffffffffff167f244b9baf4950ca2fe1a97e6554bb3d42adcb5176ed4c2cccdcac5ba347083faf30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff166362a5af3b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200131657600080fd5b505af11580156200132b573d6000803e3d6000fd5b505050506040513d60208110156200134257600080fd5b810190808051906020019092919050505092505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562001449576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b620014558383620019fe565b905092915050565b60008060008073ffffffffffffffffffffffffffffffffffffffff16600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141562001500576000925062001693565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190508073ffffffffffffffffffffffffffffffffffffffff16631709ef07878988886040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808560ff1660ff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018261ffff1661ffff168152602001945050505050602060405180830381600087803b1580156200165357600080fd5b505af115801562001668573d6000803e3d6000fd5b505050506040513d60208110156200167f57600080fd5b810190808051906020019092919050505092505b5050949350505050565b6000620016aa3362001e71565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515620017c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b620017cc8262001e71565b9050919050565b600080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060008273ffffffffffffffffffffffffffffffffffffffff1614156200194f5760009250620019f7565b8190508073ffffffffffffffffffffffffffffffffffffffff16638866eaec6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620019b757600080fd5b505af1158015620019cc573d6000803e3d6000fd5b505050506040513d6020811015620019e357600080fd5b810190808051906020019092919050505092505b5050919050565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151562001b19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925082600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f8dd2cc620baff525b40e073032a29d6c425c4bfd40ab80cfb2d0270cf7ae7d7130604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a38291508173ffffffffffffffffffffffffffffffffffffffff16632b3c0a40876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801562001e2657600080fd5b505af115801562001e3b573d6000803e3d6000fd5b505050506040513d602081101562001e5257600080fd5b8101908080519060200190929190505050506001935050505092915050565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151562001f8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffff",
        "ffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508291508473ffffffffffffffffffffffffffffffffffffffff167f8c10fb30e3dc93f1332bdb81522fd134da355b8188e1aa3e7adb3a2ca90e8e5f30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff1663ea8a1af06040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620021ce57600080fd5b505af1158015620021e3573d6000803e3d6000fd5b505050506040513d6020811015620021fa57600080fd5b81019080805190602001909291905050509350505050919050565b6040516141a8806200222783390190560060806040526000600c60146101000a81548160ff021916908360ff1602179055503480156200002d57600080fd5b50604051604080620041a8833981018060405281019080805190602001909291908051906020019092919050505081336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271060056004018190555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506000600c60156101000a81548160ff021916908360ff160217905550620001208162000128640100000000026401000000009004565b5050620002b0565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000213576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc66d1d23a5b7baf1f496bb19f580d7b12070ad5a08a758c990db97d961fa33a660405160405180910390a350565b613ee880620002c06000396000f300608060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630a0155e5146101385780630b8160451461017d5780630fb3844c1461026b57806313af40351461029c5780631400a813146102df5780631709ef07146103485780632b3c0a40146103de57806344b63d051461043957806362a5af3b14610468578063669271de146104975780636a28f000146105345780638866eaec14610563578063a02b161e14610592578063a683e853146105d7578063a730117e14610677578063adc1fb77146106d6578063b2623cb014610792578063b2bdfa7b146107e9578063b890392314610840578063c3d4cb0b14610871578063c9d27afe14610934578063ea8a1af014610985578063f5ee9c7a146109b4575b600080fd5b34801561014457600080fd5b5061016360048036038101908080359060200190929190505050610a83565b604051808215151515815260200191505060405180910390f35b34801561018957600080fd5b506101a860048036038101908080359060200190929190505050610aa0565b604051808981526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018761ffff1661ffff1681526020018661ffff1661ffff1681526020018560ff1660ff1681526020018460ff1660ff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018261ffff1661ffff1681526020019850505050505050505060405180910390f35b34801561027757600080fd5b50610280610adb565b604051808260ff1660ff16815260200191505060405180910390f35b3480156102a857600080fd5b506102dd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610aee565b005b3480156102eb57600080fd5b5061032e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050610c75565b604051808215151515815260200191505060405180910390f35b34801561035457600080fd5b506103c4600480360381019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050610f65565b604051808215151515815260200191505060405180910390f35b3480156103ea57600080fd5b5061041f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fb4565b604051808215151515815260200191505060405180910390f35b34801561044557600080fd5b5061044e6110ea565b604051808215151515815260200191505060405180910390f35b34801561047457600080fd5b5061047d6111f9565b604051808215151515815260200191505060405180910390f35b3480156104a357600080fd5b50610513600480360381019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff16906020019092919050505061142f565b60405180831515151581526020018281526020019250505060405180910390f35b34801561054057600080fd5b50610549611747565b604051808215151515815260200191505060405180910390f35b34801561056f57600080fd5b5061057861198b565b604051808215151515815260200191505060405180910390f35b34801561059e57600080fd5b506105bd600480360381019080803590602001909291905050506119a7565b604051808215151515815260200191505060405180910390f35b3480156105e357600080fd5b5061065d60048036038101908080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050611b44565b604051808215151515815260200191505060405180910390f35b34801561068357600080fd5b506106b8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e5a565b604051808261ffff1661ffff16815260200191505060405180910390f35b3480156106e257600080fd5b5061070160048036038101908080359060200190929190505050611e77565b604051808560ff1660ff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018261ffff1661ffff16815260200194505050505060405180910390f35b34801561079e57600080fd5b506107a7611ea0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107f557600080fd5b506107fe611ec6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561084c57600080fd5b50610855611eeb565b604051808260ff1660ff16815260200191505060405180910390f35b34801561087d57600080fd5b50610886611efe565b6040518080602001806020018461ffff1661ffff168152602001838103835286818151815260200191508051906020019060200280838360005b838110156108db5780820151818401526020810190506108c0565b50505050905001838103825285818151815260200191508051906020019060200280838360005b8381101561091d578082015181840152602081019050610902565b505050509050019550505050505060405180910390f35b34801561094057600080fd5b5061096b60048036038101908080359060200190929190803515159060200190929190505050611f18565b604051808215151515815260200191505060405180910390f35b34801561099157600080fd5b5061099a6121a3565b604051808215151515815260200191505060405180910390f35b3480156109c057600080fd5b50610a696004803603810190808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803561ffff169060200190929190505050612368565b604051808215151515815260200191505060405180910390f35b6000610a9982600561249f90919063ffffffff16565b9050919050565b600080600080600080600080610ac08960056124d290919063ffffffff16565b9750975097",
        "5097509750975097509750919395975091939597565b600c60149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610bd8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc66d1d23a5b7baf1f496bb19f580d7b12070ad5a08a758c990db97d961fa33a660405160405180910390a350565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e016856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015610e1f57600080fd5b505af1158015610e33573d6000803e3d6000fd5b505050506040513d6020811015610e4957600080fd5b810190808051906020019092919050505090506000600c60159054906101000a900460ff1660ff1614158015610eac5750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1515610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f5745476f7665726e616e63653a2077656967687420616464726573732073686f81526020017f756c6420626520657869737465642e000000000000000000000000000000000081525060400191505060405180910390fd5b610f5c818460016127a79092919063ffffffff16565b91505092915050565b600080600c60159054906101000a900460ff1660ff161415610f8a5760019050610fac565b610fa98560ff168686868660056129519095949392919063ffffffff16565b90505b949350505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60156101000a81548160ff021916908360ff1602179055506001905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6112ee61198b565b1515611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f206973206e6f726d616c2e00000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60146101000a81548160ff021916908360ff1602179055507f667265657a6500000000000000000000000000000000000000000000000000007f7d78a1adf6a29dad801d43ddd0c4478ec0cbf1bd9bfdd2e007d90429959f363e30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b611673600160606040519081016040529081600182018054806020026020016040519081016040528092919081815260200182805480156115b257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611568575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561163257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116115f95790505b505050505081526020016003820160009054906101000a900461ffff1661ffff1661ffff1681525050878787876005612b019095949392919063ffffffff16565b80925081935050508473ffffffffffffffffffffffffffffffffffffffff168660ff16827f6bc2a40e2ac753b31d589730c2651eeb053a0abb859435dadcbb916fa464227a878730604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018361ffff1661ffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a494509492505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611834576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60149054906101000a900460ff1660ff161415156118e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f2069732061626e6f726d616c2e0000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60146101000a81548160ff021916908360ff1602179055507f756e667265657a650000000000000000000000000000000000000000000000007f7d78a1adf6a29dad801d43ddd0c4478ec0cbf1bd9bfdd2e007d90429959f363e30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b600080600c60149054906101000a900460ff1660ff1614905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611a515750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611ac5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4f6e6c79206163636f756e74206d616e616765722e000000000000000000000081525060200191505060405180910390fd5b",
        "611ad9826005612b3a90919063ffffffff16565b9050817ff749e1738bb417e5c8584a97954122c20a7d6b24c00ee4282bacae10ad9b590c30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a2919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c30576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b611d8960016060604051908101604052908160018201805480602002602001604051908101604052809291908181526020018280548015611cc657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611c7c575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611d4657602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611d0d5790505b505050505081526020016003820160009054906101000a900461ffff1661ffff1661ffff168152505087878787876005612d4d909695949392919063ffffffff16565b50809150508373ffffffffffffffffffffffffffffffffffffffff168560ff16877f6bc2a40e2ac753b31d589730c2651eeb053a0abb859435dadcbb916fa464227a868630604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018361ffff1661ffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a495945050505050565b6000611e7082600161308490919063ffffffff16565b9050919050565b600080600080611e9185600561311290919063ffffffff16565b93509350935093509193509193565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60159054906101000a900460ff1681565b6060806000611f0d600161324d565b925092509250909192565b6000612025600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e016336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015611fda57600080fd5b505af1158015611fee573d6000803e3d6000fd5b505050506040513d602081101561200457600080fd5b8101908080519060200190929190505050600161337c90919063ffffffff16565b1515612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f566f74652073686f756c6420626520696e20746865206c69737400000000000081525060200191505060405180910390fd5b61219b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e016336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561215957600080fd5b505af115801561216d573d6000803e3d6000fd5b505050506040513d602081101561218357600080fd5b81019080805190602001909291905050508484613427565b905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061224d57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156122c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f426173654163636f756e743a206f6e6c7920617574686f72697a65642e00000081525060200191505060405180910390fd5b6002600c60146101000a81548160ff021916908360ff1602179055507f63616e63656c00000000000000000000000000000000000000000000000000007f7d78a1adf6a29dad801d43ddd0c4478ec0cbf1bd9bfdd2e007d90429959f363e30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612454576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60156101000a81548160ff021916908360ff16021790555061247a60016134e0565b5061249384848460016135c3909392919063ffffffff16565b50600190509392505050565b6000600183600501600084815260200190815260200160002060009054906101000a900460ff1660ff1614905092915050565b6000806000806000806000806124e6613c22565b8a8a600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8c60060160008d81526020019081526020016000206101006040519081016040529081600082015481526020016001820160009054906101000a900461ffff1661ffff1661ffff1681526020016001820160029054906101000a900461ffff1661ffff1661ffff1681526020016001820160049054906101000a900460ff1660ff1660ff1681526020016001820160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160199054906101000a900460ff1660ff1660ff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160149054906101000a900461ffff1661ffff1661ffff16815250509250826000015183608001518460200151856040015186606001518760a001518860c001518960e001519a509a509a509a509a509a509a509a505050509295985092959890939650565b6000808460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081141561290057846001018490806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508460020183908060018154018082558091505090600182039060005260206000209060109182820401919006600202909192909190916101000a81548161ffff021916908361ffff1602179055505084600101805490508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612945565b82856002016001830381548110151561291557fe5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505b60019150509392505050565b600061295d878761249f565b15612af2578373ffffffffffffffffffffffffffffffffffffffff1687600601600088815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156129ff57508460ff1687600601600088815260200190815260200160002060010160049054906101000a900460ff1660ff16145b8015612a6e57508273ffffffffffffffffffffffffffffffffffffffff1687600601600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8015612aa757508161ffff1687600601600088815260200190815260200160002060020160149054906101000a900461ffff1661ffff16145b8015612adb57506001876006016000888152602001908152602001600020",
        "60010160199054906101000a900460ff1660ff16145b15612ae95760019050612af7565b60009050612af7565b600090505b9695505050505050565b6000808760040160008154809291906001019190505550612b2b88888a6004015489898989612d4d565b91509150965096945050505050565b60008282600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612c41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600085600501600086815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508460060160008581526020019081526020016000206000808201600090556001820160006101000a81549061ffff02191690556001820160026101000a81549061ffff02191690556001820160046101000a81549060ff02191690556001820160056101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160196101000a81549060ff02191690556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556002820160146101000a81549061ffff02191690555050505092915050565b6000806000612d5a613c22565b8a89600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612e5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4c6962426f617264566f74653a20766f7465206964206e6f742065786973746581526020017f642e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8b604001519350610100604051908101604052808c81526020018561ffff168152602001600061ffff1681526020018b60ff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001600060ff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018861ffff168152509250828d60060160008d81526020019081526020016000206000820151816000015560208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548161ffff021916908361ffff16021790555060608201518160010160046101000a81548160ff021916908360ff16021790555060808201518160010160056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160010160196101000a81548160ff021916908360ff16021790555060c08201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160020160146101000a81548161ffff021916908361ffff16021790555090505060018d60050160008d815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060018b955095505050505097509795505050505050565b60008060008460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915084600201600183038154811015156130e157fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff169050809250505092915050565b6000806000808585600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561321d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61323a886006016000898152602001908152602001600020613744565b9550955095509550505092959194509250565b606080600083600101846002018560030160009054906101000a900461ffff16828054806020026020016040519081016040528092919081815260200182805480156132ee57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116132a4575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561336857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161332f5790505b505050505091509250925092509193909250565b6000808360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081148061340d5750600084600201600183038154811015156133e357fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff16145b1561341b5760009150613420565b600191505b5092915050565b60008060009050613449600186868660056137c890949392919063ffffffff16565b80925081935050508473ffffffffffffffffffffffffffffffffffffffff16847f04a4fe0bd778eb9d1e84c14e70e87a6fa39d0121e01a1ca803cd3aaf42c6b13c853060405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a3509392505050565b600080600090505b826001018054905081101561358457826000016000846001018381548110151561350e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580806001019150506134e8565b8260010160006135949190613ca6565b8260020160006135a49190613cc7565b8260030160006101000a81549061ffff02191690556001915050919050565b600080856135d081613994565b151561366a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f4c6962426f617264566f74653a20766f746520776569676874206973206e6f7481526020017f20656d7074792e0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b85876001019080519060200190613682929190613cef565b508487600201908051906020019061369b929190613d79565b50838760030160006101000a81548161ffff021916908361ffff160217905550600091505b8551821015613736576001820187600001600088858151811015156136e157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081806001019250506136c0565b600192505050949350505050565b6000806000808460010160049054906101000a900460ff168560010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168760020160149054906101000a900461ffff1693509350935093509193509193565b6000806000808886600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156138d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6138dd8a8a613084565b935060008461ffff1611151561395b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f766f7465206572726f722c206e6f7420612076616c696420766f7465722e000081525060200191505060405180910390fd5b8a6006016000898152602001908152602001600020925061397e838a868a6139ca565b8096508197505050505050509550959350505050565b600080826001018054905011806139b2575060008260020180549050115b156139c057600090506139c5565b600190505b919050565b6000808560030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015613a7957508215158660040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b15613a9c5760008660010160029054906101000a900461ffff1691509150613c19565b8215613ad557838660010160028282829054906101000a900461ffff160192506101000a81548161ff",
        "ff021916908361ffff1602179055505b60018660030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550828660040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560010160009054906101000a900461ffff1661ffff168660010160029054906101000a900461ffff1661ffff16101515613be05760018660010160196101000a81548160ff021916908360ff160217905550613bff565b60008660010160196101000a81548160ff021916908360ff1602179055505b60018660010160029054906101000a900461ffff16915091505b94509492505050565b6101006040519081016040528060008152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600061ffff1681525090565b5080546000825590600052602060002090810190613cc49190613e23565b50565b50805460008255600f016010900490600052602060002090810190613cec9190613e23565b50565b828054828255906000526020600020908101928215613d68579160200282015b82811115613d675782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613d0f565b5b509050613d759190613e48565b5090565b82805482825590600052602060002090600f01601090048101928215613e125791602002820160005b83821115613de257835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613da2565b8015613e105782816101000a81549061ffff0219169055600201602081600101049283019260010302613de2565b505b509050613e1f9190613e8b565b5090565b613e4591905b80821115613e41576000816000905550600101613e29565b5090565b90565b613e8891905b80821115613e8457600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101613e4e565b5090565b90565b613eb991905b80821115613eb557600081816101000a81549061ffff021916905550600101613e91565b5090565b905600a165627a7a72305820e10920cc71fe2b42c2838641af53a024cb72889078b4aee325e0b97690ecd6a00029a165627a7a723058209e4be82675cc89f8f4523f12f8a1a24301a317e9c055d92de00a1eebbbe541ca0029"
    };

    public static final String BINARY = String.join("", BINARY_ARRAY);

    public static final String[] SM_BINARY_ARRAY = {
        "6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506163fa806100536000396000f300608060405260043610620000eb576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305282c7014620000f057806328e91489146200013657806338f2333d146200019057806361cb24c314620002295780639e4ad09b1462000287578063a5d51f7414620002e5578063b54ef4a1146200036b578063ba01371214620003c9578063c4dcade61462000427578063c8d83aaf14620004ad578063cff04a4214620004df578063d65f68ba146200053d578063edf93aa514620005bb578063f12c66df1462000639578063ff74a7481462000697575b600080fd5b348015620000fd57600080fd5b5062000134600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000728565b005b3480156200014357600080fd5b506200014e620008b0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200019d57600080fd5b506200020f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050620008d5565b604051808215151515815260200191505060405180910390f35b3480156200023657600080fd5b506200026d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000b15565b604051808215151515815260200191505060405180910390f35b3480156200029457600080fd5b50620002cb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000d8f565b604051808215151515815260200191505060405180910390f35b348015620002f257600080fd5b5062000329600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000e11565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200037857600080fd5b50620003af600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000e7a565b604051808215151515815260200191505060405180910390f35b348015620003d657600080fd5b506200040d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000f79565b604051808215151515815260200191505060405180910390f35b3480156200043457600080fd5b506200046b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620010b9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620004ba57600080fd5b50620004c562001122565b604051808215151515815260200191505060405180910390f35b348015620004ec57600080fd5b5062000523600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001134565b604051808215151515815260200191505060405180910390f35b3480156200054a57600080fd5b50620005a1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001149565b604051808215151515815260200191505060405180910390f35b348015620005c857600080fd5b506200061f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200124a565b604051808215151515815260200191505060405180910390f35b3480156200064657600080fd5b506200067d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001435565b604051808215151515815260200191505060405180910390f35b348015620006a457600080fd5b50620006db600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620016af565b60405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000813576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f480107a875206c9f5ec6e8b65d989106e27d0fc8b130625b25997540ddfc334a60405160405180910390a350565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008073ffffffffffffffffffffffffffffffffffffffff16600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141562000978576000925062000b0b565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190508073ffffffffffffffffffffffffffffffffffffffff16630d32aad3878988886040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808560ff1660ff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018261ffff1661ffff168152602001945050505050602060405180830381600087803b15801562000acb57600080fd5b505af115801562000ae0573d6000803e3d6000fd5b505050506040513d602081101562000af757600080fd5b810190808051906020019092919050505092505b5050949350505050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000c05576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190508373ffffffffffffffffffffffffffffffffffffffff167fff8289a1541a8bd747b4e19602ccecd11a469b14671d7cc3325062c974c3ae6330604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff166308165cd66040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562000d4957600080fd5b505af115801562000d5e573d6000803e3d6000fd5b505050506040513d602081101562000d7557600080fd5b810190808051906020019092919050505092505050919050565b600080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000f67576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b62000f7282620019fe565b9050919050565b6000806000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffff",
        "ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060008273ffffffffffffffffffffffffffffffffffffffff1614156200100a5760009250620010b2565b8190508073ffffffffffffffffffffffffffffffffffffffff166335968e686040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200107257600080fd5b505af115801562001087573d6000803e3d6000fd5b505050506040513d60208110156200109e57600080fd5b810190808051906020019092919050505092505b5050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006200112f33620019fe565b905090565b600062001142823362001da2565b9050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562001236576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b62001242838362001da2565b905092915050565b60008060008360028660006200126384848484620008d5565b1515620012fe576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f4163636f756e744d616e616765723a2075736572206e6f74207573657250657281526020017f6d69747465642e0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6200130a898962001da2565b965086156200142957600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1695508594508473ffffffffffffffffffffffffffffffffffffffff16631ad69a6e60026040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015620013e957600080fd5b505af1158015620013fe573d6000803e3d6000fd5b505050506040513d60208110156200141557600080fd5b810190808051906020019092919050505096505b50505050505092915050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562001525576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190508373ffffffffffffffffffffffffffffffffffffffff167fde9b2f6104fa4abead11e320ea9108a54d8f81193384f019ee98c0bfe5b029ed30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff16638f55e2256040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200166957600080fd5b505af11580156200167e573d6000803e3d6000fd5b505050506040513d60208110156200169557600080fd5b810190808051906020019092919050505092505050919050565b600080600080846000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515620017ca576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f616c726561647920657869737465642e0000000000000000000000000000000081525060400191505060405180910390fd5b3086620017d662002215565b808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050604051809103906000f0801580156200185c573d6000803e3d6000fd5b50925082915081600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f25d37cca48ccf96ed90675991ae3f4fdb428d2cd704ea14c1bd2d9ab6021214530604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a360018294509450505050915091565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151562001b19576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508291508473ffffffffffffffffffffffffffffffffffffffff167fb1dbc1be8412705445ee41c620d31c010ba14cd0cb0f28972f45b7f72b41c25d30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff1663df3150aa6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562001d5b57600080fd5b505af115801562001d70573d6000803e3d6000fd5b505050506040513d602081101562001d8757600080fd5b81019080805190602001909291905050509350505050919050565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151562001ebd576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925082600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008773ffffffffffffff",
        "ffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f3800db655763ee91d8147809ddca52183b58036e8a8c952c5d1352c72afb660230604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a38291508173ffffffffffffffffffffffffffffffffffffffff16638b011498876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015620021ca57600080fd5b505af1158015620021df573d6000803e3d6000fd5b505050506040513d6020811015620021f657600080fd5b8101908080519060200190929190505050506001935050505092915050565b6040516141a8806200222783390190560060806040526000600c60146101000a81548160ff021916908360ff1602179055503480156200002d57600080fd5b50604051604080620041a8833981018060405281019080805190602001909291908051906020019092919050505081336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271060056004018190555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506000600c60156101000a81548160ff021916908360ff160217905550620001208162000128640100000000026401000000009004565b5050620002b0565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000213576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f480107a875206c9f5ec6e8b65d989106e27d0fc8b130625b25997540ddfc334a60405160405180910390a350565b613ee880620002c06000396000f300608060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305282c701461013857806308165cd61461017b5780630d32aad3146101aa5780631ad69a6e1461024057806320e462b01461028557806328e91489146102ca57806335968e6814610321578063398fc78114610350578063582bc239146103a757806366a24696146103f85780636f53a472146104b45780637c1a8d95146105515780638b0114981461063f5780638f55e2251461069a578063a0cdc682146106c9578063a2495d4614610798578063aef5ecfa146107c7578063d1dcf9ae14610826578063df3150aa14610857578063ede7ddf614610886578063ef79841d146108b7578063fb029fda1461097a578063fdc10eed14610a1a575b600080fd5b34801561014457600080fd5b50610179600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a83565b005b34801561018757600080fd5b50610190610c0a565b604051808215151515815260200191505060405180910390f35b3480156101b657600080fd5b50610226600480360381019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050610e4e565b604051808215151515815260200191505060405180910390f35b34801561024c57600080fd5b5061026b60048036038101908080359060200190929190505050610e9d565b604051808215151515815260200191505060405180910390f35b34801561029157600080fd5b506102b06004803603810190808035906020019092919050505061103a565b604051808215151515815260200191505060405180910390f35b3480156102d657600080fd5b506102df611057565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561032d57600080fd5b5061033661107c565b604051808215151515815260200191505060405180910390f35b34801561035c57600080fd5b50610365611098565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103b357600080fd5b506103de600480360381019080803590602001909291908035151590602001909291905050506110be565b604051808215151515815260200191505060405180910390f35b34801561040457600080fd5b5061042360048036038101908080359060200190929190505050611349565b604051808560ff1660ff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018261ffff1661ffff16815260200194505050505060405180910390f35b3480156104c057600080fd5b50610530600480360381019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050611372565b60405180831515151581526020018281526020019250505060405180910390f35b34801561055d57600080fd5b5061057c6004803603810190808035906020019092919050505061168a565b604051808981526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018761ffff1661ffff1681526020018661ffff1661ffff1681526020018560ff1660ff1681526020018460ff1660ff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018261ffff1661ffff1681526020019850505050505050505060405180910390f35b34801561064b57600080fd5b50610680600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116c5565b604051808215151515815260200191505060405180910390f35b3480156106a657600080fd5b506106af6117fb565b604051808215151515815260200191505060405180910390f35b3480156106d557600080fd5b5061077e6004803603810190808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803561ffff169060200190929190505050611a31565b604051808215151515815260200191505060405180910390f35b3480156107a457600080fd5b506107ad611b68565b604051808215151515815260200191505060405180910390f35b3480156107d357600080fd5b50610808600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c77565b604051808261ffff1661ffff16815260200191505060405180910390f35b34801561083257600080fd5b5061083b611c94565b604051808260ff1660ff16815260200191505060405180910390f35b34801561086357600080fd5b5061086c611ca7565b604051808215151515815260200191505060405180910390f35b34801561089257600080fd5b5061089b611e6c565b604051808260ff1660ff16815260200191505060405180910390f35b3480156108c357600080fd5b506108cc611e7f565b6040518080602001806020018461ffff1661ffff168152602001838103835286818151815260200191508051906020019060200280838360005b83811015610921578082015181840152602081019050610906565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015610963578082015181840152602081019050610948565b505050509050019550505050505060405180910390f35b34801561098657600080fd5b50610a0060048036038101908080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050611e99565b604051808215151515815260200191505060405180910390f35b348015610a2657600080fd5b50610a69600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff1690602001909291905050506121af565b604051808215151515815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffff",
        "ffffffffffffffffffffffff16141515610b6d576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f480107a875206c9f5ec6e8b65d989106e27d0fc8b130625b25997540ddfc334a60405160405180910390a350565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610cf7576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60149054906101000a900460ff1660ff16141515610da7576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f2069732061626e6f726d616c2e0000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60146101000a81548160ff021916908360ff1602179055507f756e667265657a650000000000000000000000000000000000000000000000007f598b76607bab91793e04db590052049ff4ca46cfc234328da5536f5169790af730604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b600080600c60159054906101000a900460ff1660ff161415610e735760019050610e95565b610e928560ff1686868686600561249f9095949392919063ffffffff16565b90505b949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f475750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610fbb576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4f6e6c79206163636f756e74206d616e616765722e000000000000000000000081525060200191505060405180910390fd5b610fcf82600561264f90919063ffffffff16565b9050817f5266434aba1b39373168719f7f2d659dffcb1169882fc929c56fa6e8589fe9a230604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a2919050565b600061105082600561286290919063ffffffff16565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600c60149054906101000a900460ff1660ff1614905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111cb600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f74336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561118057600080fd5b505af1158015611194573d6000803e3d6000fd5b505050506040513d60208110156111aa57600080fd5b8101908080519060200190929190505050600161289590919063ffffffff16565b151561123f576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f566f74652073686f756c6420626520696e20746865206c69737400000000000081525060200191505060405180910390fd5b611341600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f74336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156112ff57600080fd5b505af1158015611313573d6000803e3d6000fd5b505050506040513d602081101561132957600080fd5b81019080805190602001909291905050508484612940565b905092915050565b6000806000806113638560056129f990919063ffffffff16565b93509350935093509193509193565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145f576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6115b6600160606040519081016040529081600182018054806020026020016040519081016040528092919081815260200182805480156114f557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116114ab575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561157557602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161153c5790505b505050505081526020016003820160009054906101000a900461ffff1661ffff1661ffff1681525050878787876005612b349095949392919063ffffffff16565b80925081935050508473ffffffffffffffffffffffffffffffffffffffff168660ff16827f095e656aa11fe030d6cf71f4a33de53c10d94b4b3002eefbb7f905e143fcb0b5878730604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018361ffff1661ffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a494509492505050565b6000806000806000806000806116aa896005612b6d90919063ffffffff16565b97509750975097509750975097509750919395975091939597565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117b2576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e8576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6118f061107c565b151561198a576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f206973206e6f726d616c2e00000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60146101000a81548160ff021916908360ff1602179055507f667265657a6500000000000000000000000000000000000000000000000000007f598b76607bab91793e04db590052049ff4ca46cfc234328da5536f5169790af730604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b1d576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f",
        "57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60156101000a81548160ff021916908360ff160217905550611b436001612e42565b50611b5c8484846001612f25909392919063ffffffff16565b50600190509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c54576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60156101000a81548160ff021916908360ff1602179055506001905090565b6000611c8d8260016130a690919063ffffffff16565b9050919050565b600c60159054906101000a900460ff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611d5157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611dc5576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f426173654163636f756e743a206f6e6c7920617574686f72697a65642e00000081525060200191505060405180910390fd5b6002600c60146101000a81548160ff021916908360ff1602179055507f63616e63656c00000000000000000000000000000000000000000000000000007f598b76607bab91793e04db590052049ff4ca46cfc234328da5536f5169790af730604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b600c60149054906101000a900460ff1681565b6060806000611e8e6001613134565b925092509250909192565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f85576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6120de6001606060405190810160405290816001820180548060200260200160405190810160405280929190818152602001828054801561201b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611fd1575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561209b57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116120625790505b505050505081526020016003820160009054906101000a900461ffff1661ffff1661ffff168152505087878787876005613263909695949392919063ffffffff16565b50809150508373ffffffffffffffffffffffffffffffffffffffff168560ff16877f095e656aa11fe030d6cf71f4a33de53c10d94b4b3002eefbb7f905e143fcb0b5868630604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018361ffff1661ffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a495945050505050565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229c576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f74856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561235957600080fd5b505af115801561236d573d6000803e3d6000fd5b505050506040513d602081101561238357600080fd5b810190808051906020019092919050505090506000600c60159054906101000a900460ff1660ff16141580156123e65750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1515612480576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f5745476f7665726e616e63653a2077656967687420616464726573732073686f81526020017f756c6420626520657869737465642e000000000000000000000000000000000081525060400191505060405180910390fd5b6124968184600161359a9092919063ffffffff16565b91505092915050565b60006124ab8787612862565b15612640578373ffffffffffffffffffffffffffffffffffffffff1687600601600088815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561254d57508460ff1687600601600088815260200190815260200160002060010160049054906101000a900460ff1660ff16145b80156125bc57508273ffffffffffffffffffffffffffffffffffffffff1687600601600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80156125f557508161ffff1687600601600088815260200190815260200160002060020160149054906101000a900461ffff1661ffff16145b80156126295750600187600601600088815260200190815260200160002060010160199054906101000a900460ff1660ff16145b156126375760019050612645565b60009050612645565b600090505b9695505050505050565b60008282600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612756576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600085600501600086815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508460060160008581526020019081526020016000206000808201600090556001820160006101000a81549061ffff02191690556001820160026101000a81549061ffff02191690556001820160046101000a81549060ff02191690556001820160056101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160196101000a81549060ff02191690556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556002820160146101000a81549061ffff02191690555050505092915050565b6000600183600501600084815260200190815260200160002060009054906101000a900460ff1660ff1614905092915050565b6000808360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114806129265750600084600201600183038154811015156128fc57fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff16145b156129345760009150612939565b600191505b5092915050565b600080600090506129626001868686600561374490949392919063ffffffff16565b80925081935050508473ffffffffffffffffffffffffffffffffffffffff16847f840e27e8c58f2eb0ad79d711f0779c5edc7765309b5a0c4f4869c9039759266a853060405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a3509392505050565b6000806000808585600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612b04576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c72",
        "6561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612b21886006016000898152602001908152602001600020613910565b9550955095509550505092959194509250565b6000808760040160008154809291906001019190505550612b5e88888a6004015489898989613263565b91509150965096945050505050565b600080600080600080600080612b81613c22565b8a8a600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612c86576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8c60060160008d81526020019081526020016000206101006040519081016040529081600082015481526020016001820160009054906101000a900461ffff1661ffff1661ffff1681526020016001820160029054906101000a900461ffff1661ffff1661ffff1681526020016001820160049054906101000a900460ff1660ff1660ff1681526020016001820160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160199054906101000a900460ff1660ff1660ff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160149054906101000a900461ffff1661ffff1661ffff16815250509250826000015183608001518460200151856040015186606001518760a001518860c001518960e001519a509a509a509a509a509a509a509a505050509295985092959890939650565b600080600090505b8260010180549050811015612ee6578260000160008460010183815481101515612e7057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558080600101915050612e4a565b826001016000612ef69190613ca6565b826002016000612f069190613cc7565b8260030160006101000a81549061ffff02191690556001915050919050565b60008085612f3281613994565b1515612fcc576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f4c6962426f617264566f74653a20766f746520776569676874206973206e6f7481526020017f20656d7074792e0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b85876001019080519060200190612fe4929190613cef565b5084876002019080519060200190612ffd929190613d79565b50838760030160006101000a81548161ffff021916908361ffff160217905550600091505b85518210156130985760018201876000016000888581518110151561304357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508180600101925050613022565b600192505050949350505050565b60008060008460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150846002016001830381548110151561310357fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff169050809250505092915050565b606080600083600101846002018560030160009054906101000a900461ffff16828054806020026020016040519081016040528092919081815260200182805480156131d557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161318b575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561324f57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116132165790505b505050505091509250925092509193909250565b6000806000613270613c22565b8a89600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613374576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4c6962426f617264566f74653a20766f7465206964206e6f742065786973746581526020017f642e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8b604001519350610100604051908101604052808c81526020018561ffff168152602001600061ffff1681526020018b60ff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001600060ff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018861ffff168152509250828d60060160008d81526020019081526020016000206000820151816000015560208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548161ffff021916908361ffff16021790555060608201518160010160046101000a81548160ff021916908360ff16021790555060808201518160010160056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160010160196101000a81548160ff021916908360ff16021790555060c08201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160020160146101000a81548161ffff021916908361ffff16021790555090505060018d60050160008d815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060018b955095505050505097509795505050505050565b6000808460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114156136f357846001018490806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508460020183908060018154018082558091505090600182039060005260206000209060109182820401919006600202909192909190916101000a81548161ffff021916908361ffff1602179055505084600101805490508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613738565b82856002016001830381548110151561370857fe5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505b60019150509392505050565b6000806000808886600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561384f576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6138598a8a6130a6565b935060008461ffff161115156138d7576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f766f7465206572726f722c206e6f7420612076616c696420766f7465722e000081525060200191505060405180910390fd5b8a600601600089815260200190815260200160002092506138fa838a868a6139ca565b8096508197505050505050509550959350505050565b6000806000808460010160049054906101000a900460ff168560010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168760020160149054906101000a900461ffff1693509350935093509193509193565b600080826001018054905011806139b2575060008260020180549050115b156139c057600090506139c5565b600190505b919050565b6000808560030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015613a7957508215158660040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b15613a9c5760008660010160029054906101000a900461ffff1691509150613c19565b8215613ad557838660010160028282829054906101000a900461ffff160192506101000a81548161ff",
        "ff021916908361ffff1602179055505b60018660030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550828660040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560010160009054906101000a900461ffff1661ffff168660010160029054906101000a900461ffff1661ffff16101515613be05760018660010160196101000a81548160ff021916908360ff160217905550613bff565b60008660010160196101000a81548160ff021916908360ff1602179055505b60018660010160029054906101000a900461ffff16915091505b94509492505050565b6101006040519081016040528060008152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600061ffff1681525090565b5080546000825590600052602060002090810190613cc49190613e23565b50565b50805460008255600f016010900490600052602060002090810190613cec9190613e23565b50565b828054828255906000526020600020908101928215613d68579160200282015b82811115613d675782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613d0f565b5b509050613d759190613e48565b5090565b82805482825590600052602060002090600f01601090048101928215613e125791602002820160005b83821115613de257835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613da2565b8015613e105782816101000a81549061ffff0219169055600201602081600101049283019260010302613de2565b505b509050613e1f9190613e8b565b5090565b613e4591905b80821115613e41576000816000905550600101613e29565b5090565b90565b613e8891905b80821115613e8457600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101613e4e565b5090565b90565b613eb991905b80821115613eb557600081816101000a81549061ffff021916905550600101613e91565b5090565b905600a165627a7a723058200351535d685d6235d62dc0aa5f858180aca5a88b214e64fcf1e4c5b66495495b0029a165627a7a72305820a519f3ab76eeba3e1b9b594fd82fbb96ba0779fcbee578b48fad0f58638fb90a0029"
    };

    public static final String SM_BINARY = String.join("", SM_BINARY_ARRAY);

    public static final String[] ABI_ARRAY = {
        "[{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"newAccount\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newExternalAccount\",\"type\":\"address\"}],\"name\":\"setExternalAccountByUser\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"unfreeze\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newExternalAccount\",\"type\":\"address\"},{\"name\":\"oldExternalAccount\",\"type\":\"address\"}],\"name\":\"setExternalAccountBySocial\",\"outputs\":[{\"name\":\"b\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"userAddress\",\"type\":\"address\"}],\"name\":\"getExternalAccount\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"freeze\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newExternalAccount\",\"type\":\"address\"},{\"name\":\"oldExternalAccount\",\"type\":\"address\"}],\"name\":\"setExternalAccountByGovernance\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"},{\"name\":\"operType\",\"type\":\"uint8\"},{\"name\":\"newAddress\",\"type\":\"address\"},{\"name\":\"newValue\",\"type\":\"uint16\"}],\"name\":\"accountPermitFunc\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"cancelByUser\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"cancelByGovernance\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"hasAccount\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"getUserAccount\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"isExternalAccountNormal\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"externalAccount\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"userAccount\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"accountManagerAddress\",\"type\":\"address\"}],\"name\":\"LogManageNewAccount\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"newExternalAccount\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"oldExternalAccount\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"accountManagerAddress\",\"type\":\"address\"}],\"name\":\"LogManageExternalAccount\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"externalAccount\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"accountManagerAddress\",\"type\":\"address\"}],\"name\":\"LogManageFreeze\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"externalAccount\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"accountManagerAddress\",\"type\":\"address\"}],\"name\":\"LogManageUnfreeze\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"externalAccount\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"accountManagerAddress\",\"type\":\"address\"}],\"name\":\"LogManageCancel\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"LogSetOwner\",\"type\":\"event\"}]"
    };

    public static final String ABI = String.join("", ABI_ARRAY);

    public static final String FUNC_NEWACCOUNT = "newAccount";

    public static final String FUNC_SETOWNER = "setOwner";

    public static final String FUNC_SETEXTERNALACCOUNTBYUSER = "setExternalAccountByUser";

    public static final String FUNC_UNFREEZE = "unfreeze";

    public static final String FUNC_SETEXTERNALACCOUNTBYSOCIAL = "setExternalAccountBySocial";

    public static final String FUNC_GETEXTERNALACCOUNT = "getExternalAccount";

    public static final String FUNC_FREEZE = "freeze";

    public static final String FUNC_SETEXTERNALACCOUNTBYGOVERNANCE =
            "setExternalAccountByGovernance";

    public static final String FUNC_ACCOUNTPERMITFUNC = "accountPermitFunc";

    public static final String FUNC_CANCELBYUSER = "cancelByUser";

    public static final String FUNC__OWNER = "_owner";

    public static final String FUNC_CANCELBYGOVERNANCE = "cancelByGovernance";

    public static final String FUNC_HASACCOUNT = "hasAccount";

    public static final String FUNC_GETUSERACCOUNT = "getUserAccount";

    public static final String FUNC_ISEXTERNALACCOUNTNORMAL = "isExternalAccountNormal";

    public static final Event LOGMANAGENEWACCOUNT_EVENT =
            new Event(
                    "LogManageNewAccount",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Address>(true) {},
                            new TypeReference<Address>(true) {},
                            new TypeReference<Address>() {}));;

    public static final Event LOGMANAGEEXTERNALACCOUNT_EVENT =
            new Event(
                    "LogManageExternalAccount",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Address>(true) {},
                            new TypeReference<Address>(true) {},
                            new TypeReference<Address>() {}));;

    public static final Event LOGMANAGEFREEZE_EVENT =
            new Event(
                    "LogManageFreeze",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Address>(true) {}, new TypeReference<Address>() {}));;

    public static final Event LOGMANAGEUNFREEZE_EVENT =
            new Event(
                    "LogManageUnfreeze",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Address>(true) {}, new TypeReference<Address>() {}));;

    public static final Event LOGMANAGECANCEL_EVENT =
            new Event(
                    "LogManageCancel",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Address>(true) {}, new TypeReference<Address>() {}));;

    public static final Event LOGSETOWNER_EVENT =
            new Event(
                    "LogSetOwner",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Address>(true) {},
                            new TypeReference<Address>(true) {}));;

    protected AccountManager(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
    }

    public static String getBinary(CryptoSuite cryptoSuite) {
        return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY);
    }

    public TransactionReceipt newAccount(String externalAccount) {
        final Function function =
                new Function(
                        FUNC_NEWACCOUNT,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void newAccount(String externalAccount, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_NEWACCOUNT,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForNewAccount(String externalAccount) {
        final Function function =
                new Function(
                        FUNC_NEWACCOUNT,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getNewAccountInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_NEWACCOUNT,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>((String) results.get(0).getValue());
    }

    public Tuple2<Boolean, String> getNewAccountOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_NEWACCOUNT,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<Bool>() {}, new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<Boolean, String>(
                (Boolean) results.get(0).getValue(), (String) results.get(1).getValue());
    }

    public TransactionReceipt setOwner(String owner) {
        final Function function =
                new Function(
                        FUNC_SETOWNER,
                        Arrays.<Type>asList(new Address(owner)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setOwner(String owner, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_SETOWNER,
                        Arrays.<Type>asList(new Address(owner)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetOwner(String owner) {
        final Function function =
                new Function(
                        FUNC_SETOWNER,
                        Arrays.<Type>asList(new Address(owner)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getSetOwnerInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_SETOWNER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>((String) results.get(0).getValue());
    }

    public TransactionReceipt setExternalAccountByUser(String newExternalAccount) {
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYUSER,
                        Arrays.<Type>asList(new Address(newExternalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setExternalAccountByUser(String newExternalAccount, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYUSER,
                        Arrays.<Type>asList(new Address(newExternalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetExternalAccountByUser(String newExternalAccount) {
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYUSER,
                        Arrays.<Type>asList(new Address(newExternalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getSetExternalAccountByUserInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYUSER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>((String) results.get(0).getValue());
    }

    public Tuple1<Boolean> getSetExternalAccountByUserOutput(
            TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYUSER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public TransactionReceipt unfreeze(String externalAccount) {
        final Function function =
                new Function(
                        FUNC_UNFREEZE,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void unfreeze(String externalAccount, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_UNFREEZE,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForUnfreeze(String externalAccount) {
        final Function function =
                new Function(
                        FUNC_UNFREEZE,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getUnfreezeInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_UNFREEZE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>((String) results.get(0).getValue());
    }

    public Tuple1<Boolean> getUnfreezeOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_UNFREEZE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public TransactionReceipt setExternalAccountBySocial(
            String newExternalAccount, String oldExternalAccount) {
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYSOCIAL,
                        Arrays.<Type>asList(
                                new Address(newExternalAccount), new Address(oldExternalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setExternalAccountBySocial(
            String newExternalAccount, String oldExternalAccount, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYSOCIAL,
                        Arrays.<Type>asList(
                                new Address(newExternalAccount), new Address(oldExternalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetExternalAccountBySocial(
            String newExternalAccount, String oldExternalAccount) {
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYSOCIAL,
                        Arrays.<Type>asList(
                                new Address(newExternalAccount), new Address(oldExternalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<String, String> getSetExternalAccountBySocialInput(
            TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYSOCIAL,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<Address>() {}, new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<String, String>(
                (String) results.get(0).getValue(), (String) results.get(1).getValue());
    }

    public Tuple1<Boolean> getSetExternalAccountBySocialOutput(
            TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYSOCIAL,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public String getExternalAccount(String userAddress) throws ContractException {
        final Function function =
                new Function(
                        FUNC_GETEXTERNALACCOUNT,
                        Arrays.<Type>asList(new Address(userAddress)),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public TransactionReceipt freeze(String externalAccount) {
        final Function function =
                new Function(
                        FUNC_FREEZE,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void freeze(String externalAccount, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_FREEZE,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForFreeze(String externalAccount) {
        final Function function =
                new Function(
                        FUNC_FREEZE,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getFreezeInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_FREEZE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>((String) results.get(0).getValue());
    }

    public Tuple1<Boolean> getFreezeOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_FREEZE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public TransactionReceipt setExternalAccountByGovernance(
            String newExternalAccount, String oldExternalAccount) {
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYGOVERNANCE,
                        Arrays.<Type>asList(
                                new Address(newExternalAccount), new Address(oldExternalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setExternalAccountByGovernance(
            String newExternalAccount, String oldExternalAccount, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYGOVERNANCE,
                        Arrays.<Type>asList(
                                new Address(newExternalAccount), new Address(oldExternalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetExternalAccountByGovernance(
            String newExternalAccount, String oldExternalAccount) {
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYGOVERNANCE,
                        Arrays.<Type>asList(
                                new Address(newExternalAccount), new Address(oldExternalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<String, String> getSetExternalAccountByGovernanceInput(
            TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYGOVERNANCE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<Address>() {}, new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<String, String>(
                (String) results.get(0).getValue(), (String) results.get(1).getValue());
    }

    public Tuple1<Boolean> getSetExternalAccountByGovernanceOutput(
            TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_SETEXTERNALACCOUNTBYGOVERNANCE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public Boolean accountPermitFunc(
            String externalAccount, BigInteger operType, String newAddress, BigInteger newValue)
            throws ContractException {
        final Function function =
                new Function(
                        FUNC_ACCOUNTPERMITFUNC,
                        Arrays.<Type>asList(
                                new Address(externalAccount),
                                new org.fisco.bcos.sdk.abi.datatypes.generated.Uint8(operType),
                                new Address(newAddress),
                                new org.fisco.bcos.sdk.abi.datatypes.generated.Uint16(newValue)),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        return executeCallWithSingleValueReturn(function, Boolean.class);
    }

    public TransactionReceipt cancelByUser() {
        final Function function =
                new Function(
                        FUNC_CANCELBYUSER,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void cancelByUser(TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_CANCELBYUSER,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForCancelByUser() {
        final Function function =
                new Function(
                        FUNC_CANCELBYUSER,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<Boolean> getCancelByUserOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_CANCELBYUSER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public String _owner() throws ContractException {
        final Function function =
                new Function(
                        FUNC__OWNER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public TransactionReceipt cancelByGovernance(String externalAccount) {
        final Function function =
                new Function(
                        FUNC_CANCELBYGOVERNANCE,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void cancelByGovernance(String externalAccount, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_CANCELBYGOVERNANCE,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForCancelByGovernance(String externalAccount) {
        final Function function =
                new Function(
                        FUNC_CANCELBYGOVERNANCE,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getCancelByGovernanceInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_CANCELBYGOVERNANCE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>((String) results.get(0).getValue());
    }

    public Tuple1<Boolean> getCancelByGovernanceOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_CANCELBYGOVERNANCE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public Boolean hasAccount(String externalAccount) throws ContractException {
        final Function function =
                new Function(
                        FUNC_HASACCOUNT,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        return executeCallWithSingleValueReturn(function, Boolean.class);
    }

    public String getUserAccount(String externalAccount) throws ContractException {
        final Function function =
                new Function(
                        FUNC_GETUSERACCOUNT,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public Boolean isExternalAccountNormal(String externalAccount) throws ContractException {
        final Function function =
                new Function(
                        FUNC_ISEXTERNALACCOUNTNORMAL,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        return executeCallWithSingleValueReturn(function, Boolean.class);
    }

    public List<LogManageNewAccountEventResponse> getLogManageNewAccountEvents(
            TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList =
                extractEventParametersWithLog(LOGMANAGENEWACCOUNT_EVENT, transactionReceipt);
        ArrayList<LogManageNewAccountEventResponse> responses =
                new ArrayList<LogManageNewAccountEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogManageNewAccountEventResponse typedResponse = new LogManageNewAccountEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.externalAccount =
                    (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.userAccount = (String) eventValues.getIndexedValues().get(1).getValue();
            typedResponse.accountManagerAddress =
                    (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogManageNewAccountEvent(
            String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGENEWACCOUNT_EVENT);
        subscribeEvent(ABI, BINARY, topic0, fromBlock, toBlock, otherTopics, callback);
    }

    public void subscribeLogManageNewAccountEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGENEWACCOUNT_EVENT);
        subscribeEvent(ABI, BINARY, topic0, callback);
    }

    public List<LogManageExternalAccountEventResponse> getLogManageExternalAccountEvents(
            TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList =
                extractEventParametersWithLog(LOGMANAGEEXTERNALACCOUNT_EVENT, transactionReceipt);
        ArrayList<LogManageExternalAccountEventResponse> responses =
                new ArrayList<LogManageExternalAccountEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogManageExternalAccountEventResponse typedResponse =
                    new LogManageExternalAccountEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.newExternalAccount =
                    (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.oldExternalAccount =
                    (String) eventValues.getIndexedValues().get(1).getValue();
            typedResponse.accountManagerAddress =
                    (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogManageExternalAccountEvent(
            String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEEXTERNALACCOUNT_EVENT);
        subscribeEvent(ABI, BINARY, topic0, fromBlock, toBlock, otherTopics, callback);
    }

    public void subscribeLogManageExternalAccountEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEEXTERNALACCOUNT_EVENT);
        subscribeEvent(ABI, BINARY, topic0, callback);
    }

    public List<LogManageFreezeEventResponse> getLogManageFreezeEvents(
            TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList =
                extractEventParametersWithLog(LOGMANAGEFREEZE_EVENT, transactionReceipt);
        ArrayList<LogManageFreezeEventResponse> responses =
                new ArrayList<LogManageFreezeEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogManageFreezeEventResponse typedResponse = new LogManageFreezeEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.externalAccount =
                    (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.accountManagerAddress =
                    (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogManageFreezeEvent(
            String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEFREEZE_EVENT);
        subscribeEvent(ABI, BINARY, topic0, fromBlock, toBlock, otherTopics, callback);
    }

    public void subscribeLogManageFreezeEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEFREEZE_EVENT);
        subscribeEvent(ABI, BINARY, topic0, callback);
    }

    public List<LogManageUnfreezeEventResponse> getLogManageUnfreezeEvents(
            TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList =
                extractEventParametersWithLog(LOGMANAGEUNFREEZE_EVENT, transactionReceipt);
        ArrayList<LogManageUnfreezeEventResponse> responses =
                new ArrayList<LogManageUnfreezeEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogManageUnfreezeEventResponse typedResponse = new LogManageUnfreezeEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.externalAccount =
                    (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.accountManagerAddress =
                    (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogManageUnfreezeEvent(
            String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEUNFREEZE_EVENT);
        subscribeEvent(ABI, BINARY, topic0, fromBlock, toBlock, otherTopics, callback);
    }

    public void subscribeLogManageUnfreezeEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEUNFREEZE_EVENT);
        subscribeEvent(ABI, BINARY, topic0, callback);
    }

    public List<LogManageCancelEventResponse> getLogManageCancelEvents(
            TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList =
                extractEventParametersWithLog(LOGMANAGECANCEL_EVENT, transactionReceipt);
        ArrayList<LogManageCancelEventResponse> responses =
                new ArrayList<LogManageCancelEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogManageCancelEventResponse typedResponse = new LogManageCancelEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.externalAccount =
                    (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.accountManagerAddress =
                    (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogManageCancelEvent(
            String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGECANCEL_EVENT);
        subscribeEvent(ABI, BINARY, topic0, fromBlock, toBlock, otherTopics, callback);
    }

    public void subscribeLogManageCancelEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGECANCEL_EVENT);
        subscribeEvent(ABI, BINARY, topic0, callback);
    }

    public List<LogSetOwnerEventResponse> getLogSetOwnerEvents(
            TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList =
                extractEventParametersWithLog(LOGSETOWNER_EVENT, transactionReceipt);
        ArrayList<LogSetOwnerEventResponse> responses =
                new ArrayList<LogSetOwnerEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogSetOwnerEventResponse typedResponse = new LogSetOwnerEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.owner = (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.contractAddress =
                    (String) eventValues.getIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogSetOwnerEvent(
            String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGSETOWNER_EVENT);
        subscribeEvent(ABI, BINARY, topic0, fromBlock, toBlock, otherTopics, callback);
    }

    public void subscribeLogSetOwnerEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGSETOWNER_EVENT);
        subscribeEvent(ABI, BINARY, topic0, callback);
    }

    public static AccountManager load(
            String contractAddress, Client client, CryptoKeyPair credential) {
        return new AccountManager(contractAddress, client, credential);
    }

    public static AccountManager deploy(Client client, CryptoKeyPair credential)
            throws ContractException {
        return deploy(
                AccountManager.class, client, credential, getBinary(client.getCryptoSuite()), "");
    }

    public static class LogManageNewAccountEventResponse {
        public TransactionReceipt.Logs log;

        public String externalAccount;

        public String userAccount;

        public String accountManagerAddress;
    }

    public static class LogManageExternalAccountEventResponse {
        public TransactionReceipt.Logs log;

        public String newExternalAccount;

        public String oldExternalAccount;

        public String accountManagerAddress;
    }

    public static class LogManageFreezeEventResponse {
        public TransactionReceipt.Logs log;

        public String externalAccount;

        public String accountManagerAddress;
    }

    public static class LogManageUnfreezeEventResponse {
        public TransactionReceipt.Logs log;

        public String externalAccount;

        public String accountManagerAddress;
    }

    public static class LogManageCancelEventResponse {
        public TransactionReceipt.Logs log;

        public String externalAccount;

        public String accountManagerAddress;
    }

    public static class LogSetOwnerEventResponse {
        public TransactionReceipt.Logs log;

        public String owner;

        public String contractAddress;
    }
}
